import { login, getUserInfo, getUserDetailById } from "@/api/user";
import { getToken, removeToken, setTimeStamp, setToken } from "@/utils/auth";

//  状态
const state = {
  token: getToken(),
  userInfo: {} // 设置为空对象而不是 null 是因为会在 getters 中引用 userinfo 变量  如果设置为 null 会引起异常和报错
};

// 修改状态
const mutations = {
  // 设置 token
  setToken(state, token) {
    state.token = token;
    // vuex 变化  缓存数据到 cookie
    setToken(token);
  },

  // 删除缓存
  removeToken(state) {
    state.token = null;
    removeToken(); //清除缓存中的 token
  },

  //  设置用户信息
  setUserInfo(state, userInfo) {
    state.userInfo = { ...userInfo };
    //  用 浅拷贝的方式去赋值对象  因为这样数据更新之后，才会触发组件的更新
  },

  //  删除用户信息
  removeUserInfo(state) {
    state.userInfo = {};
  }
};

// 执行异步
const actions = {
  async login(context, data) {
    const result = await login(data);
    // console.log(result);
    //  因为在相应拦截器中已经判断过数据是否正确  所以既然有数据的返回  就一定是正确的 这里就不用再执行 if 判断
    context.commit("setToken", result);
    // if (result.data.success) {
    //   context.commit("setToken", result.data.data);
    // }

    //  写入时间戳
    setTimeStamp(); // 将当前最新的时间写入缓存
  },

  //  获取用户资料
  async getUserInfo(context) {
    const result = await getUserInfo(); // 获取返回值  result 就是用户的基本资料
    const baseInfo = await getUserDetailById(result.userId); // 获取用户头像
    const baseResult = { ...result, ...baseInfo }; // 将两个接口合并
    // console.log(result, "result");
    context.commit("setUserInfo", baseResult); // 将整个的个人信息设置到用户的 vuex 数据中
    return result; // 为什么返回  为后面埋下伏笔
  },

  //  退出登录
  logout(context) {
    //  删除 token
    context.commit("removeToken");
    //  删除用户资料
    context.commit("removeUserInfo");
  }
};

export default {
  namespaced: true,
  state,
  mutations,
  actions
};
